package com.ruoyi.supplier.service.impl;

import java.util.List;

import com.ruoyi.common.constant.BusinessConstants;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.uuid.NumberUtils;
import com.ruoyi.supplier.domain.*;
import com.ruoyi.supplier.mapper.TbStoreInMapper;
import com.ruoyi.supplier.mapper.TbStoreMapper;
import com.ruoyi.supplier.mapper.TbStoreOutMapper;
import com.ruoyi.supplier.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.UUID;

import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.supplier.mapper.TbStoreShelfMapper;

/**
 * 库存盘点Service业务层处理
 *
 * @author ruoyi
 * @date 2021-03-08
 */
@Service
public class TbStoreShelfServiceImpl implements ITbStoreShelfService {
    public static final Logger log = LoggerFactory.getLogger(TbStoreShelfServiceImpl.class);
    @Autowired
    private TbStoreShelfMapper tbStoreShelfMapper;
    @Autowired
    private ITbStoreInService tbStoreInServiceImpl;


    @Autowired
    private ITbStoreOutService tbStoreOutServiceImpl;
    @Autowired
    private ITbPriceService tbPriceServiceImpl;

    @Autowired
    private ITbPriceStoreService tbPriceStoreServiceImpl;


    /**
     * 查询库存盘点
     *
     * @param id 库存盘点ID
     * @return 库存盘点
     */
    @Override
    public TbStoreShelf selectTbStoreShelfById(Long id) {
        return tbStoreShelfMapper.selectTbStoreShelfById(id);
    }

    /**
     * 查询库存盘点列表
     *
     * @param tbStoreShelf 库存盘点
     * @return 库存盘点
     */
    @Override
    public List<TbStoreShelf> selectTbStoreShelfList(TbStoreShelf tbStoreShelf) {
        return tbStoreShelfMapper.selectTbStoreShelfList(tbStoreShelf);
    }

    /**
     * 新增库存盘点
     *
     * @param tbStoreShelf 库存盘点
     * @return 结果
     */
    @Transactional
    @Override
    public int insertTbStoreShelf(TbStoreShelf tbStoreShelf) {
        tbStoreShelf.setCreateTime(DateUtils.getNowDate());
        int rows = tbStoreShelfMapper.insertTbStoreShelf(tbStoreShelf);
        insertTbStoreShelfDetail(tbStoreShelf);
        return rows;
    }

    @Transactional
    @Override
    public int insertTbStoreShelfQty(TbStoreShelf tbStoreShelf) {
        tbStoreShelf.setCreateTime(DateUtils.getNowDate());
        int rows = tbStoreShelfMapper.insertTbStoreShelf(tbStoreShelf);
        insertTbStoreShelfDetailQty(tbStoreShelf);
        return rows;
    }

    @Transactional
    @Override
    public int updateTbStoreShelfQty(TbStoreShelf tbStoreShelf) {
        tbStoreShelf.setUpdateTime(DateUtils.getNowDate());
        tbStoreShelfMapper.deleteTbStoreShelfDetailByShelfId(tbStoreShelf.getId());
        insertTbStoreShelfDetailQty(tbStoreShelf);
        return tbStoreShelfMapper.updateTbStoreShelf(tbStoreShelf);
    }

    @Override
    public String selectNumber() {
        String number = tbStoreShelfMapper.selectNumber();
        return NumberUtils.autoGenericNumber(number, BusinessConstants.PD);
    }


    /**
     * 修改库存盘点
     *
     * @param tbStoreShelf 库存盘点
     * @return 结果
     */
    @Transactional
    @Override
    public int updateTbStoreShelf(TbStoreShelf tbStoreShelf) {
        tbStoreShelf.setUpdateTime(DateUtils.getNowDate());
        tbStoreShelfMapper.deleteTbStoreShelfDetailByShelfId(tbStoreShelf.getId());
        insertTbStoreShelfDetail(tbStoreShelf);
        return tbStoreShelfMapper.updateTbStoreShelf(tbStoreShelf);
    }

    /**
     * 批量删除库存盘点
     *
     * @param ids 需要删除的库存盘点ID
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteTbStoreShelfByIds(Long[] ids) {
        tbStoreShelfMapper.deleteTbStoreShelfDetailByShelfIds(ids);
        return tbStoreShelfMapper.deleteTbStoreShelfByIds(ids);
    }

    /**
     * 删除库存盘点信息
     *
     * @param id 库存盘点ID
     * @return 结果
     */
    @Override
    public int deleteTbStoreShelfById(Long id) {
        tbStoreShelfMapper.deleteTbStoreShelfDetailByShelfId(id);
        return tbStoreShelfMapper.deleteTbStoreShelfById(id);
    }


    /**
     * 新增库存盘点明细信息
     *
     * @param tbStoreShelf 库存盘点对象
     */
    public void insertTbStoreShelfDetail(TbStoreShelf tbStoreShelf) {
        List<TbStoreShelfDetail> tbStoreShelfDetailList = tbStoreShelf.getTbStoreShelfDetailList();
        Long id = tbStoreShelf.getId();
        if (StringUtils.isNotNull(tbStoreShelfDetailList)) {
            List<TbStoreShelfDetail> list = new ArrayList<TbStoreShelfDetail>();
            for (TbStoreShelfDetail tbStoreShelfDetail : tbStoreShelfDetailList) {
                tbStoreShelfDetail.setShelfId(id);
                list.add(tbStoreShelfDetail);
            }
            if (list.size() > 0) {
                tbStoreShelfMapper.batchTbStoreShelfDetail(list);
            }
        }
    }

    private void insertTbStoreShelfDetailQty(TbStoreShelf tbStoreShelf) {

        List<TbStoreShelfDetail> tbStoreShelfDetailList = tbStoreShelf.getTbStoreShelfDetailList();
        Long id = tbStoreShelf.getId();
        if (StringUtils.isNotNull(tbStoreShelfDetailList)) {
            TbStoreIn tbStoreIn = new TbStoreIn();
            tbStoreIn.setStoreDate(tbStoreShelf.getShelfDate());
            tbStoreIn.setStoreId(tbStoreShelf.getStoreId()); // 仓库ID
            tbStoreIn.setStoreType(1);  // 0、手工入库  1、盘点入库
            tbStoreIn.setStoreNumber(tbStoreInServiceImpl.selectNumber());
            tbStoreIn.setsId(tbStoreShelf.getsId()); // 门店类型ID
            tbStoreIn.setStoreStatus(Long.valueOf(1));
            tbStoreIn.setCreateBy(tbStoreShelf.getCreateBy());
            tbStoreIn.setUpdateBy(tbStoreShelf.getUpdateBy());


            TbStoreOut tbStoreOut = new TbStoreOut();
            tbStoreOut.setStoreDate(tbStoreShelf.getShelfDate());
            tbStoreOut.setStoreId(tbStoreShelf.getStoreId());
            tbStoreOut.setsId(tbStoreShelf.getsId());
            tbStoreOut.setStoreType(1); // 0、手工出库   1、盘点出库
            tbStoreOut.setStoreNumber(tbStoreOutServiceImpl.selectNumber());
            tbStoreOut.setStoreStatus(Long.valueOf(1)); //盘点出库
            tbStoreOut.setCreateBy(tbStoreShelf.getCreateBy());
            tbStoreOut.setUpdateBy(tbStoreShelf.getUpdateBy());


            List<TbStoreShelfDetail> list = new ArrayList<TbStoreShelfDetail>();
            List<TbStoreInDetail> listStoreInDetail = new ArrayList<>();
            List<TbStoreOutDetail> listStoreOutDetail = new ArrayList<>();
            List<TbPriceStore> listPriceStore = new ArrayList<>();
            for (TbStoreShelfDetail tbStoreShelfDetail : tbStoreShelfDetailList) {
                tbStoreShelfDetail.setShelfId(id);
                list.add(tbStoreShelfDetail);

                TbPriceStore tbPriceStore = new TbPriceStore();
                tbPriceStore.setPriceId(tbStoreShelfDetail.getPriceId());
                tbPriceStore.setStoreId(tbStoreShelf.getStoreId());
                tbPriceStore.setsId(tbStoreShelf.getsId());
                tbPriceStore.setStoreCount(tbStoreShelfDetail.getPhysicalAssets()); // 实物库存盘点
                listPriceStore.add(tbPriceStore);

                // 盘盈
                if (tbStoreShelfDetail.getPhysicalDifference() > 0) {
                    TbStoreInDetail tbStoreInDetail = new TbStoreInDetail();
                    tbStoreInDetail.setBrandDesc(tbStoreShelfDetail.getBrandDesc());
                    tbStoreInDetail.setItemName(tbStoreShelfDetail.getItemName());
                    tbStoreInDetail.setProductDate(tbStoreShelfDetail.getProductDate());
                    tbStoreInDetail.setProductId(tbStoreShelfDetail.getProductId());
                    tbStoreInDetail.setProductName(tbStoreShelfDetail.getProductName());
                    tbStoreInDetail.setTypeName(tbStoreShelfDetail.getTypeName());
                    tbStoreInDetail.setProductSn(tbStoreShelfDetail.getProductSn());
                    tbStoreInDetail.setQty(tbStoreShelfDetail.getPhysicalDifference());
                    tbStoreInDetail.setPriceId(tbStoreShelfDetail.getPriceId());
                    listStoreInDetail.add(tbStoreInDetail);


                    //盘亏
                } else if (tbStoreShelfDetail.getPhysicalDifference() < 0) {
                    TbStoreOutDetail tbStoreOutDetail = new TbStoreOutDetail();
                    tbStoreOutDetail.setBrandDesc(tbStoreShelfDetail.getBrandDesc());
                    tbStoreOutDetail.setItemName(tbStoreShelfDetail.getItemName());
                    tbStoreOutDetail.setProductDate(tbStoreShelfDetail.getProductDate());
                    tbStoreOutDetail.setProductId(tbStoreShelfDetail.getProductId());
                    tbStoreOutDetail.setProductName(tbStoreShelfDetail.getProductName());
                    tbStoreOutDetail.setTypeName(tbStoreShelfDetail.getTypeName());
                    tbStoreOutDetail.setProductSn(tbStoreShelfDetail.getProductSn());
                    tbStoreOutDetail.setQty(Math.abs(tbStoreShelfDetail.getPhysicalDifference()));
                    tbStoreOutDetail.setPriceId(tbStoreShelfDetail.getPriceId());
                    listStoreOutDetail.add(tbStoreOutDetail);

                }


            }
            //库存明细
            if (listPriceStore.size() > 0) {

                tbPriceStoreServiceImpl.updateTbPriceStore(listPriceStore);
            }

            if (listStoreInDetail.size() > 0) {
                tbStoreIn.setTbStoreInDetailList(listStoreInDetail);
                tbStoreInServiceImpl.insertTbStoreIn(tbStoreIn);

            }
            if (listStoreOutDetail.size() > 0) {
                tbStoreOut.setTbStoreOutDetailList(listStoreOutDetail);
                tbStoreOutServiceImpl.insertTbStoreOut(tbStoreOut);
            }

            if (list.size() > 0) {
                tbStoreShelfMapper.batchTbStoreShelfDetail(list);
            }
        }


    }

}
